/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quanlinganhang.dto;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import quanlinganhang.dao.AccountDAO;
import quanlinganhang.dao.LoginDAO;
import quanlinganhang.dao.Parameter;
import quanlinganhang.dao.SqlDAOHelper;

/**
 * Class gửi tiền
 *
 * @author phamduong
 */
public class DepositDTO {
    private String magd;
    private String sotaikhoan;
    private long sotien;
    private String ghichu;
    private Date ngaygui;

    public DepositDTO() {
        magd = "0";
        sotaikhoan = "";
        sotien = 0;
        ghichu = "";
        ngaygui = new Date();
    }

    /**
     * Cho phép người nhập rút tiền
     *
     * @param soTien số tiền cần rút
     * @return Chuổi thông báo
     */
    public String DepositMoney(long soTien, String accNo) {
        try {
            //sotaikhoan = "" + LoginDAO.User.getId();
            AccountDTO account = AccountDAO.GetAccountFormId(accNo);

            sotaikhoan = account.getSoTaiKhoan();

//            RuleDTO rule = new RuleDTO();
//            if (!rule.isAvailable(soTien)) {
//                return "Số tiền gửi không hợp lệ";
//            }

            // mọi thông tin OK-> rút
            sotien = soTien;
            account.setSoDuTK(account.getSoDuTK() + soTien); // tính số tiền mới
            // AccountDAO.UpdateAccount(account);  // cập nhật số tiền
            WriteLog();     // ghi lại lịch sử giao dịch
            return "Gửi tiền thành công. Số tiền: " + sotien;

        } catch (Exception ex) {
            return "Số tài khoản ko đúng hoặc không ghi log được";
        }
    }

    /**
     * Cho phép ADMIN gửi tiền cho người dùng (Gửi tiền tại quầy)
     *
     * @param soTaiKhoan Số tài khoản người cần rút
     * @param soTien Số tiền cần rút
     * @return Chuổi thông báo
     */
    public String Drawmoney(String soTaiKhoan, long soTien) {
        if (soTien <= 0 || (soTien % 1000) == 0) // phải rút chẵn tiền
        {
            return "Số tiền rút không hợp lệ";
        }

        // nếu người này có quyền admin -> có thể rút tiền của người khác
        if (LoginDAO.User.isIsAdmin()) {
            try {
                this.sotaikhoan = soTaiKhoan;
                AccountDTO account = AccountDAO.GetAccountFormId(this.sotaikhoan);

                RuleDTO rule = new RuleDTO();
                if (rule.isAvailable(soTien)) {
                    return "Số tiền rút không hợp lệ";
                }

                // mọi thông tin OK-> rút
                sotien = soTien;
                ghichu = "Gửi Bởi ADMIN: " + LoginDAO.User.getId();
                account.setSoDuTK(account.getSoDuTK() + soTien); // tính số tiền mới
                AccountDAO.UpdateAccount(account);  // cập nhật số tiền
                WriteLog();     // ghi lại lịch sử giao dịch
                return "Gửi tiền thành công. Số tiền: " + sotien;

            } catch (Exception ex) {
                return "Số tài khoản không đúng";
            }
        } else {
            return "Bạn không có quyền ADMIN";
        }
    }

    // ghi log lịch sử giao dịch
    private void WriteLog() {
        List<Parameter> sqlParams = new ArrayList<>();
        try {

            /*
             * 	@magd numeric(18,0),
             @ngayrut datetime,
             @sotaikhoan nvarchar(10),
             @sotienrut money,
             @ghichu nvarchar(50)
             */


            magd = "" + GetCurrentMaGD();

            sqlParams.add(new Parameter("magd", magd));
            //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            ngaygui = new Date();
            int nam = ngaygui.getYear() + 1900;
            String ngay = nam + "-" + ngaygui.getMonth() + "-" + ngaygui.getDay();
            sqlParams.add(new Parameter("ngaygui", ngay));
            sqlParams.add(new Parameter("sotaikhoan", sotaikhoan));
            sqlParams.add(new Parameter("sotiengui", sotien));
            sqlParams.add(new Parameter("ghichu", ghichu));
        } catch (Exception ex) {
            System.out.println("" + ex);
        }
        try {

            SqlDAOHelper.ExecuteNonQuery("Insert_GuiTien", sqlParams);
        } catch (Exception ex) {
            System.out.println("" + ex);
        }

    }

    public static long GetCurrentMaGD() throws ClassNotFoundException, SQLException {
        SqlDAOHelper.OpenConnection();
        CallableStatement cs = SqlDAOHelper.connection.prepareCall("{call MaGD_Current (?)}"); // MaGD_Current
        cs.registerOutParameter("MaGT", java.sql.Types.NVARCHAR);
        cs.executeUpdate();
        long check = cs.getLong("MaGT");
        SqlDAOHelper.CloseConnection();
        return (check + 1);
    }
    
    

    public void setGhiChu(String ghiChu) {
        this.ghichu = ghiChu;
    }
}
